/**
 * 聊天消息体类，映射 schema 结构并封装消息相关行为
 */
import store from "../store";

class Message {
  /**
   * 初始化消息实例
   * @param {Object} options - 消息参数
   * @param {string} [options._id] - 消息ID（系统自动生成，创建时可不传）
   * @param {string} [options.groupId] - 群ID（群聊时必填）
   * @param {string} options.sendUserId - 发送者用户ID（必填）
   * @param {string} options.nicName - 发送者昵称
   * @param {Object} [options.nicPic] - 发送者头像信息（如 { url: 'xxx', width: 100 }）
   * @param {Date|number} [options.timestamp] - 发送时间（默认当前时间）
   * @param {Object} [options.location] - 位置信息（如 { type: 'Point', coordinates: [lng, lat] }）
   * @param {Object} options.content - 消息内容（根据 messageType 结构不同，如文本：{ text: 'xxx' }，图片：{ url: 'xxx' }）
   * @param {Object} [options.toTarget] - 目标信息（如单聊：{ userId: 'xxx' }，群聊：{ groupId: 'xxx' }）
   * @param {string} [options.connectionId] - 连接ID（WebSocket连接时使用）
   * @param {number} options.messageType - 消息类型（1:文本, 2:图片, 3:位置, 4:系统通知等）
   * @param {string} [options.userTel] - 发送者电话（可选）
   * @param {number} [options.receiveDistance] - 接收距离（如附近消息的范围，单位：米）
   * @param {string} [options.grid] - 网格标识（用于地理位置分区）
   * @param {string[]} [options.collect] - 收藏该消息的用户ID列表（默认空数组）
   */
  constructor(options) {
    // 基础属性（映射 schema）
    this._id = options._id || null; // 系统生成ID，创建时可不传
    this.groupId = options.groupId || ''; // 群ID（群聊专用）
    this.sendUserId = options.sendUserId; // 发送者ID（必填）
    this.nicName = options.nicName || '未知用户'; // 昵称默认值
    this.nicPic = options.nicPic || { url: '/static/default-avatar.png' }; // 头像默认值
    // 时间戳处理（兼容Date对象或毫秒数）
    this.timestamp = options.timestamp 
      ? (options.timestamp instanceof Date ? options.timestamp.getTime() : options.timestamp) 
      : Date.now();
    this.location = options.location || null; // 位置信息（可选）
    this.content = options.content || {}; // 消息内容（必填，结构随类型变化）
    this.toTarget = options.toTarget || {}; // 目标信息（单聊/群聊目标）
    this.connectionId = options.connectionId || ''; // 连接ID
    this.messageType = options.messageType; // 消息类型（必填）
    this.userTel = options.userTel || ''; // 电话（可选）
    this.receiveDistance = options.receiveDistance || 0; // 接收距离默认0（无限制）
    this.grid = options.grid || ''; // 网格标识
    this.collect = options.collect || []; // 收藏列表默认空数组
	
	
	
  }

  /**
   * 格式化消息时间（显示为 "今天 12:30" 或 "2023-10-24 12:30"）
   * @returns {string} 格式化后的时间字符串
   */
  formatTime() {
    const date = new Date(this.timestamp);
    const now = new Date();
    const isToday = date.toDateString() === now.toDateString();
    const hours = date.getHours().toString().padStart(2, '0');
    const minutes = date.getMinutes().toString().padStart(2, '0');

    if (isToday) {
      return `今天 ${hours}:${minutes}`;
    } else {
      const year = date.getFullYear();
      const month = (date.getMonth() + 1).toString().padStart(2, '0');
      const day = date.getDate().toString().padStart(2, '0');
      return `${year}-${month}-${day} ${hours}:${minutes}`;
    }
  }

  /**
   * 判断消息是否为群聊消息
   * @returns {boolean} 群聊消息返回true，单聊返回false
   */
  isGroupMessage() {
    return !!this.groupId;
  }

  /**
   * 判断当前用户是否收藏了该消息
   * @param {string} userId - 当前用户ID
   * @returns {boolean} 已收藏返回true
   */
  isCollectedBy(userId) {
    return this.collect.includes(userId);
  }

  /**
   * 切换消息收藏状态（收藏/取消收藏）
   * @param {string} userId - 当前用户ID
   */
  toggleCollect(userId) {
    const index = this.collect.indexOf(userId);
    if (index > -1) {
      this.collect.splice(index, 1); // 取消收藏
    } else {
      this.collect.push(userId); // 收藏
    }
  }

  /**
   * 获取消息内容文本（兼容不同消息类型）
   * @returns {string} 可显示的文本内容
   */
  getContentText() {
    switch (this.messageType) {
      case 1: // 文本消息
        return this.content.text || '';
      case 2: // 图片消息
        return '[图片消息]';
      case 3: // 位置消息
        return `[位置：${this.content.address || '未知位置'}]`;
      case 4: // 系统通知
        return this.content.notice || '[系统通知]';
      default:
        return '[未知消息类型]';
    }
  }


  /**
   * 转换为可存储到数据库的对象（过滤不必要的临时属性）
   * @returns {Object} 数据库存储格式的对象
   */
  toDBObject() {
    // 只返回schema中定义的属性，避免冗余字段
    return {
      _id: this._id,
      groupId: this.groupId,
      sendUserId: this.sendUserId,
      nicName: this.nicName,
      nicPic: this.nicPic,
      timestamp: this.timestamp, // 存储毫秒数或Date对象（根据数据库需求）
      location: this.location,
      content: this.content,
      toTarget: this.toTarget,
      connectionId: this.connectionId,
      messageType: this.messageType,
      userTel: this.userTel,
      receiveDistance: this.receiveDistance,
      grid: this.grid,
      collect: this.collect
    };
  }

  /**
   * 从数据库查询结果创建Message实例（静态方法）
   * @param {Object} dbData - 数据库返回的消息对象
   * @returns {Message} Message实例
   */
  static fromDBData(dbData) {
    return new Message(dbData);
  }
}

export default Message;